#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
使用方法演示脚本
展示广电用户数据处理的三种使用方式
"""
import os
import pandas as pd
import sys

# 添加项目根目录到Python路径
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

# 导入我们的处理模块
from src import (
    preprocess_user_data,
    comprehensive_data_preprocessing,
    generate_user_labels,
    convert_to_wide_format,
    validate_data_quality
)

def create_sample_data(output_file="sample_user_data.csv"):
    """
    创建示例数据用于测试
    """
    print(f"创建示例数据: {output_file}")
    
    # 创建示例数据
    sample_data = [
        {"phone_no": "13800138001", "sm_name": "数字电视基础套餐", "product_name": "广电宽带50M", 
         "run_time": "2025-11-12 10:30:00", "area": "城南", "user_type": "续费用户"},
        {"phone_no": "13800138002", "sm_name": "数字电视+宽带套餐", "product_name": "广电宽带100M", 
         "run_time": "2025-11-10 15:20:00", "area": "城北", "user_type": "新用户"},
        {"phone_no": "13800138003", "sm_name": "模拟有线电视", "product_name": "基础服务", 
         "run_time": "2025-10-20 09:15:00", "area": "城东", "user_type": "老用户"},
        {"phone_no": "13800138004", "sm_name": "数字电视高级套餐", "product_name": "广电宽带200M", 
         "run_time": "2025-11-12 16:45:00", "area": "城西", "user_type": "续费用户"},
        {"phone_no": "13800138005", "sm_name": "数字电视+宽带套餐", "product_name": "广电宽带100M", 
         "run_time": "2024-05-15 14:30:00", "area": "城南", "user_type": "老用户"},
    ]
    
    # 转换为DataFrame并保存
    df = pd.DataFrame(sample_data)
    df.to_csv(output_file, sep=';', index=False, encoding='utf-8')
    print(f"示例数据已创建，共 {len(df)} 条记录")
    return output_file

def demo_method_1(input_file, output_file="processed_data_method1.csv"):
    """
    方法1: 处理单个文件
    """
    print("\n" + "="*60)
    print("方法1: 处理单个文件")
    print("="*60)
    
    try:
        # 使用preprocess_user_data处理单个文件
        print(f"开始处理文件: {input_file}")
        processed_data = preprocess_user_data(input_file)
        
        print(f"处理完成，共 {len(processed_data)} 条有效记录")
        print("数据预览:")
        print(processed_data.head())
        
        # 保存处理结果
        processed_data.to_csv(output_file, sep=';', index=False, encoding='utf-8')
        print(f"结果已保存到: {output_file}")
        
        return processed_data
        
    except Exception as e:
        print(f"方法1执行失败: {str(e)}")
        import traceback
        traceback.print_exc()
        return None

def demo_method_2(input_file, output_file="cleaned_data_method2.csv"):
    """
    方法2: 完整预处理
    """
    print("\n" + "="*60)
    print("方法2: 完整预处理")
    print("="*60)
    
    try:
        # 使用comprehensive_data_preprocessing进行完整预处理
        df_clean = comprehensive_data_preprocessing(
            input_file=input_file,
            output_file=output_file,
            rule_based_ratio=0.3  # 30%基于规则打标
        )
        
        print(f"完整预处理完成，最终数据共 {len(df_clean)} 条记录")
        print("宽表数据预览:")
        # 只显示部分列以便查看
        print(df_clean[['phone_no', 'user_label'] + 
                       [col for col in df_clean.columns if col.startswith('label_')]].head())
        
        return df_clean
        
    except Exception as e:
        print(f"方法2执行失败: {str(e)}")
        import traceback
        traceback.print_exc()
        return None

def demo_method_3(input_dir="demo_data", output_dir="demo_output"):
    """
    方法3: 批量处理
    """
    print("\n" + "="*60)
    print("方法3: 批量处理")
    print("="*60)
    
    try:
        # 创建输入和输出目录
        os.makedirs(input_dir, exist_ok=True)
        os.makedirs(output_dir, exist_ok=True)
        
        # 在输入目录中创建多个示例文件
        file1 = os.path.join(input_dir, "sample_1.csv")
        file2 = os.path.join(input_dir, "sample_2.csv")
        
        # 生成示例数据
        create_sample_data(file1)
        # 创建第二个文件，稍微修改一些数据
        df2 = pd.read_csv(file1, sep=';')
        df2['phone_no'] = df2['phone_no'].apply(lambda x: str(int(x) + 10))
        df2['area'] = ['城北', '城东', '城西', '城南', '中心']
        df2.to_csv(file2, sep=';', index=False, encoding='utf-8')
        print(f"已创建第二个示例文件: {file2}")
        
        # 导入批量处理函数
        from src.batch_processor import batch_process_user_data
        
        # 执行批量处理
        results = batch_process_user_data(
            input_dir=input_dir,
            output_dir=output_dir
        )
        
        print("批量处理完成!")
        print(f"处理了 {len(results['processed_files'])} 个文件")
        print(f"成功处理: {results['success_count']} 个")
        print(f"处理失败: {results['error_count']} 个")
        
        return results
        
    except Exception as e:
        print(f"方法3执行失败: {str(e)}")
        import traceback
        traceback.print_exc()
        return None

def create_wide_table_demo(input_file, output_file="final_wide_table.csv"):
    """
    创建最终的宽表文件
    """
    print("\n" + "="*60)
    print("创建最终宽表文件")
    print("="*60)
    
    try:
        # 使用完整预处理创建宽表
        wide_df = comprehensive_data_preprocessing(
            input_file=input_file,
            output_file=output_file,
            rule_based_ratio=0.3
        )
        
        print(f"宽表文件已创建: {output_file}")
        print(f"宽表维度: {wide_df.shape[0]} 行 × {wide_df.shape[1]} 列")
        
        # 显示标签分布
        print("\n用户标签分布:")
        label_cols = [col for col in wide_df.columns if col.startswith('label_')]
        for col in label_cols:
            count = wide_df[col].sum()
            print(f"  {col.replace('label_', '')}: {count} 个")
        
        return wide_df
        
    except Exception as e:
        print(f"创建宽表失败: {str(e)}")
        import traceback
        traceback.print_exc()
        return None

def main():
    """
    主函数，运行所有演示
    """
    print("广电用户数据处理演示脚本")
    print("="*60)
    
    # 1. 创建示例数据
    sample_file = create_sample_data()
    
    # 2. 运行三种方法的演示
    demo_method_1(sample_file)
    demo_method_2(sample_file)
    demo_method_3()
    
    # 3. 创建最终的宽表文件
    final_wide_table = os.path.join(os.path.dirname(os.path.abspath(__file__)), "final_wide_table.csv")
    create_wide_table_demo(sample_file, final_wide_table)
    
    print("\n" + "="*60)
    print("所有演示完成!")
    print(f"最终宽表文件位置: {final_wide_table}")
    print("="*60)

if __name__ == "__main__":
    main()